package com.spark.mooc.ch7_sparkstreaming.part02_basicInputSource.socket

import java.io.PrintWriter
import java.net.{ServerSocket, Socket}

import scala.io.Source

/**
 * @description: 使用Socket编程实现自定义数据源
 * @time: 2020/11/29 15:00
 * @author: lhy
 */
object DataSourceSocket {
    // 返回位于 0 到 length-1 之间的随机数
    def index(length:Int): Int ={
        val rdm = new java.util.Random()
        rdm.nextInt(length)
    }
    def main(args: Array[String]): Unit = {
//        if (args.length != 3){
//            System.err.println("Usage: <filename> <port> <millisecond>")
//            System.exit(1)
//        }
        val fileName: String = "data.txt/this.txt"          // 获取文件路径 args(0)
        val lines: Seq[String] = Source.fromFile(fileName).getLines.toList      //读取文件中的所有行的内容
        val rowCount: Int = lines.length        // 得出filename指向的文件的行数
        val listener = new ServerSocket(9999)      //创建监听特定端口的ServerSocket对象 args(1).toInt
        while (true){
            val socket: Socket = listener.accept()          // 进入阻塞状态，等待连接
            new Thread(){
                override def run(): Unit = {
                    println("Got client connected from: "+socket.getInetAddress)        // 打印客户端地址
                    val out = new PrintWriter(socket.getOutputStream,true)   // 生成输出流
                    while (true){
                        Thread.sleep(2000)        // 每隔多长时间发送一次数据 args(2).toLong
                        val content: String = lines(index(rowCount))    //从lines列表中取出一个元素
                        println(content)
                        out.write(content + "\n")           // 写入要发送给客户端的数据
                        out.flush()                         // 发送数据给客户端
                    }
                    socket.close()
                }
            }.start()
        }
    }
}
